/**
 * @author banglong
 * @date 2016/8/18.
 */
require(['avalon', 'jquery', 'es5_sham', 'loginApi', 'Layer', 'depsSelectDialog',
        'rootPath', 'tools', 'polyfill'
    ],
    function(avalon, $, es5_sham, api, layer, dialog, rootPath, tools) {
        layer.config({
            path: rootPath.getRootPath() + 'js/common/layer/'
        });

        // 定义全局常用变量 avalon jquery 方便访问
        window.avalon = avalon;
        window.JQuery = window.$ = $;

        // 设置 body 的高度以及宽度
        var _window = $(window);
        var pageHeight = _window.height();
        var pageWidth = _window.width();
        var deps; // 首先获取缓存的信息 再从服务器获取信息
        var depsHtmls = []; // 科室组成的 option html代码数组
        var $department = $('#department'); // select 对象
        // 设置 登录框 的 top 和 left
        var loginLayout = $('#main');

        loginLayout.css({
            top: tools.pxToPercent((pageHeight - 325) / 2, pageHeight),
            left: tools.pxToPercent((pageWidth - 500) / 2, pageWidth),
            display: 'block'
        });

        // 判断是否是 ie 游览器
        if (tools.isIE()) {
            var layerIndex = layer.confirm('您使用的游览器版本过低，将不能正常的使用本系统。请使用电脑开始菜单中的chrome游览器打开本系统，图标为<img src="img/login/chrome.png" alt="" style="width: 25px;height: 25px;">，网址为：http://oa.ruijin.com/webnav', {
                area: 'auto',
                maxWidth: '460',
                offset: '235px',
                btn: ['确定'] // 按钮
            }, function() {
                layer.close(layerIndex)
            });
        }
        // 定义 mvvm 对象
        var loginVm = avalon.define({
            $id: 'main',
            username: '', // 用户名
            password: '', // 密码
            department: '', // 科室
            departments: [], // 科室数组
            rules: {
                required: true
            },
            version: '0',

            showDepSelectDialog: function() { // 弹出 科室选择框
                dialog.init(deps, function(dep) {
                    loginVm.department = dep.Ksdm;
                });
            },

            validate: function(e) { // 表单验证
                e.preventDefault();
                if (!loginVm.username) {
                    layer.msg('请输入用户名', {
                        icon: 5,
                        offset: '90px'
                    });
                    return false;
                }
                if (!loginVm.password) {
                    layer.msg('请输入密码', {
                        icon: 5,
                        offset: '90px'
                    });
                    return false;
                }
                if (!loginVm.department) {
                    layer.msg('请选择科室', {
                        icon: 5,
                        offset: '90px'
                    });
                    return false;
                }
                var loginDept = deps.filter(function(dept) {
                    return dept.Ksdm === loginVm.department
                });
                var KSName = '';
                if (loginDept.length > 0) {
                    KSName = loginDept[0].Ksmc.trim();
                }
                var param = {
                    yggh: loginVm.username,
                    password: loginVm.password,
                    KSName: KSName
                };
                // var s= isDept(loginDept);
                // login(param);
                // 首先进行 SSO 登录 SSO 登录失败后进行正常的登录
                SSOLogin(param, loginDept)
            }
        });
        // 扫描
        avalon.scan(document.body);

        // 当前登录用户的信息
        var user = null;

        //声明对象
        function userDeptRelation(id, Depts) //声明对象
        {
            this.UserID = id;
            this.Depts = Depts;

        }

        /**
         * SSO登录
         * 
         * @param {}
         *            param
         */
        function SSOLogin(param, loginDept) {

            localStorage.removeItem('currentUser'); // 登录前清空部分缓存信息
            localStorage.removeItem('userJS');
            localStorage.removeItem('deptInfo');
            localStorage.removeItem('deptAccount');
            localStorage.removeItem("userDeps");
            sessionStorage.removeItem('noticeFlag');
            sessionStorage.removeItem('noticeStockFlag');
            var deptList = []
                // sso 登录失败 采用正常的登录流程
            api.ssoLogin(param)
                .then(function(ssoInfo) {

                    if (ssoInfo.rtn === "0" && ssoInfo.userInformation && ssoInfo.departmentInformation.length > 0) {
                        // 登录成功
                        deptList = ssoInfo.departmentInformation;
                        // 組裝;
                        resetUserDept(ssoInfo);
                        // resetUserDept_bak(ssoInfo);
                        return ssoInfo.userInformation.ID;
                    } else {
                        return Promise.reject(ssoInfo);
                    }
                })
                .then(function(ygid) {
                    //查找用户角色
                    api.GetRolesOfUser(Object.assign({}, param, {
                        ygid: ygid
                    })).then(function(jsonResult) {
                        if (jsonResult && jsonResult.result !== 'null') {
                            var result = JSON.parse(jsonResult.result);
                            var userJS = [];
                            for (var i = 0; i < result.length; i++) {
                                for (var j = 0; j < window.jsConfig.shJsId.length; j++) {
                                    if (result[i].Js == window.jsConfig.shJsId[j]) {
                                        userJS.push(result[i])
                                    }
                                }

                            }
                            localStorage.setItem("userJS", JSON.stringify(userJS)); // 将用户角色存入缓存中
                        }
                    });
                    // 查找用户信息
                    return api.getUserInfo(Object.assign({}, param, {
                        ygid: ygid
                    }));

                })
                .then(function(jsonResult) {
                    // 查找到用户信息 根据用户信息查找部门信息
                    if (jsonResult && jsonResult.result !== 'null') {
                        var result = JSON.parse(jsonResult.result);
                        // 更新用户信息
                        user = result;
                        localStorage.setItem("currentUser", JSON.stringify(result)); // 将用户存入缓存中
                        localStorage.setItem("username", result.Yggh); // username

                        return api.getDepartmentsByUser(Object.assign({}, param, {
                            ygid: result.Ygid
                        }));
                    }
                })

            /*// 更新登录信息
            .then(function () {
            	isDept(loginDept);
            })*/
            .then(function(jsonResult) {
                    // 做判断 是否成功查询到部门信息
                    if (jsonResult && jsonResult.issuccess === 0) {
                        // var userDeps = JSON.parse(jsonResult.result);
                        // if (userDeps && userDeps.length <= 0) {
                        // return Promise.reject('没有查询到部门信息');
                        // }

                        var isDeptAuthenticated = false;
                        // 判断用户所选的科室是否是自己的所属科室
                        for (var i = 0; i < deptList.length; i++) {
                            if (deptList[i].ID === loginVm.department) {
                                localStorage.setItem("userDeps", JSON.stringify(userDeps[i]));
                                isDeptAuthenticated = true;
                                break;
                            }
                        }
                        // 用户不属于该科室
                        if (!isDeptAuthenticated) {
                            var ex = {
                                rtn: -10001,
                                msg: '用户不能登录该科室'
                            }
                            return Promise.reject(ex);
                        }
                        // 保存用户所属的科室信息
                        localStorage.setItem("ksdm", loginVm.department); //
                        //localStorage.setItem("userDeps", userDeps);
                    }
                }) // 判断科室是否停用
                .then(function() {
                    var Ksdm = loginVm.department;
                    return api.isDept(Object.assign({}, param, {
                        condition: JSON.stringify({
                            "ColumnName": "ksdm",
                            "Oper": "Equal",
                            "Type": "String",
                            "Value": Ksdm
                        })
                    }));
                })
                .then(function(condition) {
                    if (condition === 0) {
                        // 用户不属于该科室
                        var ex = {
                            rtn: -10001,
                            msg: '该科室已停用'
                        }
                        return Promise.reject(ex);
                    }

                })
                // 更新登录信息
                .then(function() {
                    return api.updateUserLoginInfo({
                        userLoginInfo: JSON.stringify({
                            Ksdm: loginVm.department,
                            Ygid: user.Ygid,
                            Login_his: 1,
                            Update: 0
                        })
                    })
                })
                .then(function() {
                    layer.msg("登录成功", {
                        offset: '90px'
                    });
                    setTimeout(function() {
                        location.href = "loginAuthentication";
                    }, 500);
                })
                .catch(function(ex) {
                    if (ex && ex.rtn === -10001) {
                        layer.msg(ex.msg, {
                            icon: 5,
                            offset: '90px'
                        });
                    } else {
                        layer.alert('用户名或密码错误! 是否尝试本地登录', {
                            title: "登录失败",
                            closeBtn: 1 // 是否显示关闭按钮
                                ,
                            btn: ['确认'] //按钮
                                ,
                            icon: 6 // icon
                                ,
                            yes: function() {
                                // layer.msg('按钮1')
                                login(param, loginDept);
                            }
                        });
                    }
                });
        };

        function resetUserDept(ssoInfo) {
            var userDeptRelation = [];
            var Depts = [];
            for (var i = 0; i < ssoInfo.departmentInformation.length; i++) {
                Depts[i] = ssoInfo.departmentInformation[i].ID
            }
            var ygid = ssoInfo.userInformation.ID;
            var userDeptRelation = JSON.stringify([{
                UserID: ygid,
                Depts: Depts
            }]);
            api.resetUserDept({
                userDeptRelation: userDeptRelation
            })
        }

        function resetUserDept_bak(ssoInfo) {
            var userDept = [];
            var Depts = [];
            for (var i = 0; i < ssoInfo.departmentInformation.length; i++) {
                Depts[i] = ssoInfo.departmentInformation[i].ID
            }
            var DeptRelation = new userDeptRelation(ssoInfo.userInformation.ID, Depts)
            userDept[0] = DeptRelation;
            api.resetUserDept({
                userDeptRelation: JSON.stringify(userDept)
            })
        }

        /*  function isDept(deptList){
    	var Ksdm=deptList[0].Ksdm;
          api.isDept({
    	 condition: JSON.stringify({
               "ColumnName": "ksdm",
               "Oper":"Equal",
               "Type":"String",
               "Value":Ksdm
             })
           }).then(function (result) {  
        	   if (result === 0) {
                   // 用户不属于该科室
                     var ex = {
                       rtn: -10001,
                       msg: '该科室已停用'
                     }
                     return Promise.reject(ex);
                 }
        	   
           }); 
         }
      */
        /**
         * 登录操作
         * 
         * @param param
         */
        function login(param, loginDept) {
            var Ksdm = loginDept[0].Ksdm;

            localStorage.removeItem('currentUser'); // 登录前清空部分缓存信息
            localStorage.removeItem('userJS');
            localStorage.removeItem('deptInfo');
            localStorage.removeItem('deptAccount');
            localStorage.removeItem("userDeps");
            sessionStorage.removeItem('noticeFlag');
            sessionStorage.removeItem('noticeStockFlag');
            api.loginAuthentication(param)
                .then(function(jsonResult) {
                    var result = JSON.parse(jsonResult.result);
                    // 用户名 密码 错误
                    if (!result.isAuthenticated) {
                        return Promise.reject(result.message);
                    }
                    return result.ygid;
                })
                .then(function(ygid) {
                    //查找用户角色
                    api.GetRolesOfUser(Object.assign({}, param, {
                        ygid: ygid
                    })).then(function(jsonResult) {
                        if (jsonResult && jsonResult.result !== 'null') {
                            var result = JSON.parse(jsonResult.result);
                            var userJS = [];
                            for (var i = 0; i < result.length; i++) {
                                for (var j = 0; j < window.jsConfig.shJsId.length; j++) {
                                    if (result[i].Js == window.jsConfig.shJsId[j]) {
                                        userJS.push(result[i])
                                    }
                                }

                            }
                            localStorage.setItem("userJS", JSON.stringify(userJS)); // 将用户角色存入缓存中   
                        }
                    });
                    // 查找用户信息
                    return api.getUserInfo(Object.assign({}, param, {
                        ygid: ygid
                    }));
                })
                .then(function(jsonResult) {
                    // 查找到用户信息 根据用户信息查找部门信息
                    if (jsonResult && jsonResult.result !== 'null') {
                        var result = JSON.parse(jsonResult.result);
                        // 更新用户信息
                        user = result;
                        localStorage.setItem("currentUser", JSON.stringify(result)); // 将用户存入缓存中
                        localStorage.setItem("username", result.Yggh); // username

                        return api.getDepartmentsByUser(Object.assign({}, param, {
                            ygid: result.Ygid
                        }));
                    }
                })
                .then(function(jsonResult) {
                    // 做判断 是否成功查询到部门信息
                    if (jsonResult && jsonResult.issuccess === 0) {
                        var userDeps = JSON.parse(jsonResult.result);

                        if (userDeps && userDeps.length <= 0) {
                            return Promise.reject('没有查询到部门信息');
                        }

                        var isDeptAuthenticated = false;
                        // 判断用户所选的科室是否是自己的所属科室
                        for (var i = 0; i < userDeps.length; i++) {
                            if (userDeps[i].Ksdm === loginVm.department) {
                                localStorage.setItem("userDeps", JSON.stringify(userDeps[i]));
                                isDeptAuthenticated = true;
                                break;
                            }
                        }
                        // 用户不属于该科室
                        if (!isDeptAuthenticated) {
                            return Promise.reject('用户不能登录该科室');
                        }
                        // 保存用户所属的科室信息
                        localStorage.setItem("ksdm", loginVm.department);
                        // localStorage.setItem("userDeps", userDeps);
                    }
                }) // 判断科室是否停用
                .then(function(loginDept) {
                    return api.isDept(Object.assign({}, param, {
                        condition: JSON.stringify({
                            "ColumnName": "ksdm",
                            "Oper": "Equal",
                            "Type": "String",
                            "Value": Ksdm
                        })
                    }));
                }).then(function(condition) {
                    if (condition === 0) {
                        // 用户不属于该科室
                        /*  var ex = {
                            rtn: -10001,
                            msg: '该科室已停用'
                          }*/
                        return Promise.reject("该科室已停用");
                    }

                })
                // 更新登录信息
                .then(function() {
                    return api.updateUserLoginInfo({
                        userLoginInfo: JSON.stringify({
                            Ksdm: loginVm.department,
                            Ygid: user.Ygid,
                            Login_his: 1,
                            Update: 0
                        })
                    })
                })
                .then(function(jsonResult) {
                    layer.msg("登录成功", {
                        offset: '90px'
                    });
                    setTimeout(function() {
                        location.href = "loginAuthentication";
                    }, 500);
                })
                .catch(function(ex) {
                    layer.msg(ex, {
                        icon: 5,
                        offset: '90px'
                    });
                });
        }

        // 加载用户名
        loginVm.username = localStorage.getItem("username") || "";
        // promise 获取所有的 科室信息
        api.getDepartments({
                condition: 'null'
            })
            .then(function(jsonResult) {
                if (jsonResult.issuccess !== 0) {
                    return Promise.reject('系统初始化失败，请联系管理员');
                }
                deps = JSON.parse(jsonResult.result);
                // 过滤掉没有账户id的科室
                deps = deps.filter(function(data) {
                    return (data.DeptAccountID);
                });
                // 保存进缓存
                localStorage.setItem('deps', JSON.stringify(deps));
                deps.forEach(function(data) {
                    depsHtmls.push('<option value="' + data.Ksdm + '">' + data.Ksmc + '</option>')
                });

                $department.append(depsHtmls);
                // 加载上次选择的科室
                loginVm.department = localStorage.getItem("ksdm") || deps[0].Ksdm;
            })
            .catch(function(ex) {
                layer.msg(ex.message || ex, {
                    icon: 5,
                    offset: '90px'
                });
            });

        // 加载版本号等系统信息
        api.getSystemInfo()
            .then(function(jsonResult) {
                loginVm.version = jsonResult.version;
            });

        // 查询公告信息
        var msgArr = [];
        localStorage.removeItem('msgArr');
        api.getMessageInfo({})
            .then(function(jsonResult) {
                var startTime = new Date(jsonResult.startTime);
                var endTime = new Date(jsonResult.endTime);
                var now = new Date();
                if (startTime <= now && endTime > now && jsonResult.isPublic) {
                    setTimeout(function() {
                        var layerIndex = layer.confirm(jsonResult.msgContent, {
                            area: 'auto',
                            btn: ['确定'] // 按钮
                        }, function() {
                            layer.close(layerIndex)
                        });
                        msgArr.push(jsonResult.msgContent);
                        localStorage.setItem('msgArr', JSON.stringify(msgArr));
                    }, 1000);
                }
            })
    });